using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;

namespace PMServiceDesk.DataAccess
{
    public class UsuarioData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public UsuarioData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(UsuarioType usuario)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (usuario.Id == null ? "0" : usuario.Id));
                d.AddParameter("@USUARIO", usuario.Usuario);
                d.AddParameter("@CONSTRASENA", usuario.Constrasena);

                usuario.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public UsuarioType Cargar()
        {
            List<UsuarioType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<UsuarioType> CargarLista()
        {
            List<UsuarioType> l = new List<UsuarioType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    UsuarioType o = null;

                    while (r.Read())
                    {
                        o = new UsuarioType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.Usuario = r.GetValue(d.GetOrdinalReader("USUARIO")).ToString();
                        o.Constrasena = r.GetValue(d.GetOrdinalReader("CONTRASENA")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.Email = r.GetValue(d.GetOrdinalReader("EMAIL")).ToString();
                        o.ProyectoId = r.GetValue(d.GetOrdinalReader("PROYECTOID")).ToString();
                        o.Proyecto = r.GetValue(d.GetOrdinalReader("PROYECTO")).ToString();
                        o.RolId = r.GetValue(d.GetOrdinalReader("ROLID")).ToString();
                        o.Rol = r.GetValue(d.GetOrdinalReader("ROL")).ToString();
                        o.TipoDocumentoIdentidadId = r.GetValue(d.GetOrdinalReader("TIPODOCUMENTOIDENTIDADID")).ToString();
                        o.DocumentoIdentidad = r.GetValue(d.GetOrdinalReader("DOCUMENTOIDENTIDAD")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<UsuarioType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<UsuarioType> l = new List<UsuarioType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    UsuarioType o = null;

                    while (r.Read())
                    {
                        o = new UsuarioType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.Usuario = r.GetValue(d.GetOrdinalReader("USUARIO")).ToString();
                        o.Constrasena = r.GetValue(d.GetOrdinalReader("CONSTRASENA")).ToString();

                        l.Add(o);
                    }
                }

            if (l.Count < _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM USUARIO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO USUARIO
                               (
                                   USUARIO
                                  ,CONSTRASENA
                               )
                               VALUES
                               (
                                   @USUARIO
                                  ,@CONSTRASENA
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE USUARIO SET
                               USUARIO=@USUARIO
                              ,CONSTRASENA=@CONSTRASENA
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT 
                        US.ID						    [ID]
                       ,US.USUARIO					    [USUARIO]
                       ,US.CONSTRASENA				    [CONTRASENA]
                       ,REC.NOMBRE					    [NOMBRE]
                       ,UR.EMAIL					    [EMAIL]
                       ,RO.ID						    [ROLID]
                       ,RO.NOMBRE					    [ROL]
                       ,PROY.ID					        [PROYECTOID]
                       ,PROY.NOMBRE				        [PROYECTO]
                       ,REC.TIPODOCUMENTOIDENTIDADID    [TIPODOCUMENTOIDENTIDADID]
                       ,REC.DOCUMENTOIDENTIDAD          [DOCUMENTOIDENTIDAD]
                       ";

            _join = @"FROM USUARIO US
                      INNER JOIN USUARIORECURSO UR ON US.ID = UR.USUARIOID
                      INNER JOIN ROL RO ON UR.ROLID = RO.ID
                      INNER JOIN RECURSO REC ON UR.RECURSOID = REC.ID
                      INNER JOIN PROYECTO PROY ON REC.PROYECTOID = PROY.ID
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        US.ID
                       ,US.USUARIO
                       ,US.CONSTRASENA
                        ";

            _join = @"FROM DBO.USUARIO [US] 
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND US.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorProyectoId(string proyectoId)
        {
            _where += @"AND PROY.ID=@PROYECTOID
                                 ";

            _parametrosConsulta.Add("@PROYECTOID", proyectoId);
        }
        public void FiltrarPorUsuario(string usuario)
        {
            _where += @"AND US.USUARIO=@USUARIO
                                 ";

            _parametrosConsulta.Add("@USUARIO", usuario);
        }
        public void FiltrarPorConstrasena(string constrasena)
        {
            _where += @"AND US.CONSTRASENA=@CONSTRASENA
                                 ";

            _parametrosConsulta.Add("@CONSTRASENA", constrasena);
        }
        public void FiltrarPorEstadoRecurso(string estadoRecurso)
        {
            _where += @"AND REC.ESTADOID=@ESTADORECURSOID
                                 ";

            _parametrosConsulta.Add("@ESTADORECURSOID", estadoRecurso);
        }
        public void FiltrarPorRolHabilitado(bool rolHabilitado)
        {
            _where += @"AND RO.HABILITADO=@ROLHABILITADO
                                 ";

            _parametrosConsulta.Add("@ROLHABILITADO", rolHabilitado);
        }


        #endregion
    }
}
